package cn.asiontang.exception;

//import com.umeng.analytics.MobclickAgent;

import android.app.ActivityManager.MemoryInfo;
import android.app.Application;
import android.content.Context;
import android.text.format.Formatter;
import android.util.Log;

import cn.asiontang.launcher.BuildConfig;
import cn.asiontang.utils.MemoryUtils;
import cn.asiontang.utils.TextUtils;
import cn.asiontang.utils.Utils;

/**
 * 发布模式：错误时自动上传错误信息到服务器；<br/>
 * 调试模式：所有输出到LogCat
 *
 * @author AsionTang
 * @since 2014年10月15日
 */
public final class LogEx
{
    private static Application sContext;
    private static AdditionalLogDatasProvider mAdditionalLogDatasProvider;

    /**
     * <p>
     * 调试时：输出到 LogCat
     * </p>
     * <p>
     * 发布时：输出到 <b>日志文件</b>
     * </p>
     */
    public static final void d(final String tag, final Object... objs)
    {
        if (BuildConfig.DEBUG)
            Log.d(tag, LogHelper.getDebugString(objs));
        //TODO:else
        //TODO:FileLogger.d(tag, objs);
    }

    /**
     * <p>
     * 调试时：输出到 LogCat
     * </p>
     * <p>
     * 发布时：
     * <ul>
     * <li>输出到 <b>"友盟统计组件" 的reportError()</b></li>
     * <li>输出到 <b>日志文件</b></li>
     * </ul>
     * </p>
     */
    public static final void e(final String tag, final Object... objs)
    {
        if (BuildConfig.DEBUG)
            Log.e(tag, mAdditionalLogDatasProvider == null//
                    ? LogHelper.getDebugString(tag, objs) //
                    : LogHelper.getDebugString(tag, mAdditionalLogDatasProvider.getAdditionalLogDatas(), objs));
        else
        {
            //MobclickAgent.reportError(sContext, mAdditionalLogDatasProvider == null//
            //        ? LogHelper.getDebugString(tag, objs)
            //        : LogHelper.getDebugString(tag, mAdditionalLogDatasProvider.getAdditionalLogDatas(), objs));

            //TODO:FileLogger.e(tag, objs);
        }
    }

    /**
     * 发生某些错误时，一律直接发给友盟，不能再使用LogEx，否则可能会触发本地日志记录，可能出现“死循环调用”
     */
    public static final void e2online(final String tag, final Object... objs)
    {
        if (BuildConfig.DEBUG)
            Log.e(tag, LogHelper.getDebugString(tag, objs));
        // else
        //     MobclickAgent.reportError(sContext, LogHelper.getDebugString(tag, objs));
    }

    /**
     * <p>
     * 调试时：输出到 LogCat
     * </p>
     * <p>
     * 发布时：输出到 <b>日志文件</b>
     * </p>
     */
    public static final void i(final String tag, final Object... objs)
    {
        if (BuildConfig.DEBUG)
            Log.i(tag, LogHelper.getDebugString(objs));
        //TODO:        else
        //TODO:            FileLogger.i(tag, objs);
    }

    /**
     * 可以在自定义Application中的onCreate里初始化或别的地方动态初始化<br/>
     * 【不能在Application的构造函数里调用！】<br/>
     * 因为此时应用的String资源尚未初始化完毕，会报Null异常！
     *
     * @param provider 获取需要额外记录到日志头的数据信息 最终每条日志内容格式为:<br/>
     *                 <code>TAG|额外日志信息|LOG_INFO</code>
     */
    public static final void init(final Application app, final AdditionalLogDatasProvider provider)
    {
        sContext = app;
        mAdditionalLogDatasProvider = provider;

        //TODO:FileLogger.init(sContext);
    }

    /**
     * 在日志中输出当前手机的一些使用情况
     */
    public static final void outPutPhoneInfo(final String tag, final Context context)
    {
        final MemoryInfo info = MemoryUtils.displayBriefMemory();

        i(tag, "品牌:" + android.os.Build.BRAND);
        i(tag, "型号:" + Utils.getPhoneModel());
        i(tag, "android-API版本:" + android.os.Build.VERSION.SDK_INT);
        i(tag, "android-系统版本:" + android.os.Build.VERSION.RELEASE);
        i(tag, "APP版本:" + TextUtils.valueOfNoNull(Utils.getVersionCode(context)));
        i(tag, "APP名字:" + TextUtils.valueOfNoNull(Utils.getVersionName(context)));
        i(tag, "手机是否root:" + Utils.isRoot());

        i(tag, "当系统剩余内存低于" + Formatter.formatFileSize(context, info.threshold) + "时就看成低内存运行");
        i(tag, "应用最大使用内存:" + Formatter.formatFileSize(context, Runtime.getRuntime().maxMemory()));
    }

    /**
     * <p>
     * 调试时：输出到 LogCat
     * </p>
     * <p>
     * 发布时：输出到 <b>日志文件</b>
     * </p>
     */
    public static final void w(final String tag, final Object... objs)
    {
        if (BuildConfig.DEBUG)
            Log.w(tag, LogHelper.getDebugString(objs));
        //       TODO: else
        //       TODO:     FileLogger.w(tag, objs);
    }

    /**
     * 获取需要额外记录到日志头的数据信息 最终每条日志内容格式为:<br/>
     * <code>TAG|额外日志信息|LOG_INFO</code>
     *
     * @return
     */
    public interface AdditionalLogDatasProvider
    {
        /**
         * 获取需要额外记录到日志头的数据信息 最终每条日志内容格式为:<br/>
         * <code>TAG|额外日志信息|LOG_INFO</code>
         */
        Object[] getAdditionalLogDatas();
    }
}
